SeeedStudio Motorshield V2 with STP 42D206 Stepper

I was trying to use a STP42D306 stepper with a SeeedStudio Motor Shield V2 on an Arduino. This is a bipolar 2 phase stepper motor. I needed to modify the code to get it working as the SeeedStudio example is for a Unipolar motor. The code used is below. And here’s a pic of the setup:

image

No guarantee that I’ve done it correctly, but the motor spins clockwise/anticlockwise. There are some nice diagrams of the stepping process here.

//  Demo function:The application method to drive the stepper motor.
//  Hareware:Stepper motor - 24BYJ48,Seeed's Motor Shield v2.0
//  Author:Frankie.Chu
//  Date:20 November, 2012
#define MOTOR_CLOCKWISE      0
#define MOTOR_ANTICLOCKWISE  1
/******Pins definitions*************/
#define MOTORSHIELD_IN1	8//8
#define MOTORSHIELD_IN2	11//11
#define MOTORSHIELD_IN3	12//12
#define MOTORSHIELD_IN4	13//13
#define CTRLPIN_A		9//9
#define CTRLPIN_B		10//10

const unsigned char stepper_ctrl[]={0x27,0x36,0x1e,0x0f};




struct MotorStruct
{
	int8_t speed;
	uint8_t direction;
};
MotorStruct stepperMotor;
unsigned int number_of_steps = 200;
/**********************************************************************/
/*Function: Get the stepper motor rotate                               */
/*Parameter:-int steps,the total steps and the direction the motor rotates.*/
/*			if steps > 0,rotates anticlockwise,			   			   */
/*			if steps < 0,rotates clockwise.           				   */
/*Return:	void                      							      */
void step(int steps)
{
	int steps_left = abs(steps)*4;
	int step_number;
	int millis_delay = 60L * 1000L /number_of_steps/(stepperMotor.speed + 50);
delay(millis_delay);


	if (steps > 0) 
	{
		stepperMotor.direction= MOTOR_ANTICLOCKWISE;
		step_number = 0; 
	}
    else if (steps < 0) 
	{
		stepperMotor.direction= MOTOR_CLOCKWISE;
		step_number = number_of_steps;
	}
	else return;


	while(steps_left > 0) 
	{
  
               if(step_number%4 == 0) {
                 digitalWrite(MOTORSHIELD_IN1,1);
                 digitalWrite(MOTORSHIELD_IN2,0);
                 digitalWrite(MOTORSHIELD_IN3,0);
                 digitalWrite(MOTORSHIELD_IN4,0);
                 digitalWrite(CTRLPIN_A,1);
                 digitalWrite(CTRLPIN_B,0);                                
               }
               if(step_number%4 == 1) {
                 digitalWrite(MOTORSHIELD_IN1,0);
                 digitalWrite(MOTORSHIELD_IN2,0);
                 digitalWrite(MOTORSHIELD_IN3,1);
                 digitalWrite(MOTORSHIELD_IN4,0);
                 digitalWrite(CTRLPIN_A,0);
                 digitalWrite(CTRLPIN_B,1);                                
               }
               if(step_number%4 == 2) {
                 digitalWrite(MOTORSHIELD_IN1,0);
                 digitalWrite(MOTORSHIELD_IN2,1);
                 digitalWrite(MOTORSHIELD_IN3,0);
                 digitalWrite(MOTORSHIELD_IN4,0);
                 digitalWrite(CTRLPIN_A,1);
                 digitalWrite(CTRLPIN_B,0);                                
               }
               if(step_number%4 == 3) {
                 digitalWrite(MOTORSHIELD_IN1,0);
                 digitalWrite(MOTORSHIELD_IN2,0);
                 digitalWrite(MOTORSHIELD_IN3,0);
                 digitalWrite(MOTORSHIELD_IN4,1);
                 digitalWrite(CTRLPIN_A,0);
                 digitalWrite(CTRLPIN_B,1);                                
               }               
  
		//PORTB = stepper_ctrl[step_number%4];
		delay(millis_delay);
		if(stepperMotor.direction== MOTOR_ANTICLOCKWISE)
		{
			step_number++;
		    if (step_number == number_of_steps)
		    	step_number = 0;
		}
		else 
		{
			step_number--;
		    if (step_number == 0)
		    	step_number = number_of_steps;
		}
		steps_left --;
		
	}
}
void initialize()
{
	pinMode(MOTORSHIELD_IN1,OUTPUT);
	pinMode(MOTORSHIELD_IN2,OUTPUT);
	pinMode(MOTORSHIELD_IN3,OUTPUT);
	pinMode(MOTORSHIELD_IN4,OUTPUT);
	pinMode(CTRLPIN_A,OUTPUT);
	pinMode(CTRLPIN_B,OUTPUT);
	stop();
	stepperMotor.speed = 1;
	stepperMotor.direction = MOTOR_CLOCKWISE;
}
/*******************************************/
void stop()
{
	/*Unenble the pin, to stop the motor. */
	digitalWrite(CTRLPIN_A,LOW);
    digitalWrite(CTRLPIN_B,LOW);
}

void setup()
{
	initialize();//Initialization for the stepper motor.
}

void loop()
{
	step(200);//Stepper motors rotate anticlockwise 200 steps.
	delay(1000);
	step(-200);//Stepper motors rotate clockwise 200 steps.
	delay(1000);
}